package routes

import (
	"bluebell6/controllers"
	_ "bluebell6/docs"
	"bluebell6/logger"
	"bluebell6/middlewares"
	"github.com/gin-contrib/pprof"
	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
	"net/http"
	"time"
)

// SetupRouter 设置Gin路由器
func SetupRouter(mode string) *gin.Engine {
	if mode == gin.ReleaseMode {
		gin.SetMode(gin.ReleaseMode) // 设置为发布模式
	}
	r := gin.New() // 创建Gin引擎实例

	r.Use(logger.GinLogger(), logger.GinRecovery(true)) // 使用日志和恢复中间件

	r.LoadHTMLFiles("./templates/index.html") // 加载HTML模板
	r.Static("/static", "./static")           // 设置静态文件目录

	r.GET("/", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil) // 根路径渲染index.html
	})

	v1 := r.Group("/api/v1") // 创建API路由组

	v1.POST("/signup", controllers.SignUpHandler)                        // 用户注册接口
	v1.POST("/login", controllers.LoginHandler)                          // 用户登录接口
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // 集成Swagger文档
	v1.GET("/posts2", controllers.GetPostListHandler2)                   // 获取帖子列表接口

	v1.Use(middlewares.JWTAuthMiddleware(), middlewares.RateLimitMiddleware(2*time.Second, 1)) // 应用JWT认证和限流中间件
	{
		v1.GET("/community", controllers.CommunityHandler)           // 社区列表接口
		v1.GET("/community/:id", controllers.CommunityDatailHandler) // 社区详情接口
		v1.POST("/post", controllers.CreatePostHandler)              // 创建帖子接口
		v1.GET("/post/:id", controllers.GetPostDetailHandler)        // 帖子详情接口
		v1.GET("/posts/", controllers.GetPostListHandler)            // 帖子列表接口
		v1.POST("/vote", controllers.PostVoteController)             // 投票接口
	}

	pprof.Register(r) // 注册pprof性能分析路由

	r.NoRoute(func(c *gin.Context) {
		c.JSON(http.StatusNotFound, gin.H{ // 404页面处理
			"msg": "404",
		})
	})

	return r // 返回配置好的路由器
}
